#!/bin/bash
set +e
export PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"

APP_VERSION="2.4.0"
APP_BUILD=240
APP_REV="v2.4.0 • Rev 240"

SEED_SERVER='https://www.inerd.co.uk'
SEED_TOKEN=''
SEED_UID=''

APP_SUPPORT="$HOME/Library/Application Support/iNerdCloud"
CFG_FILE="$APP_SUPPORT/config.env"
LAUNCH_PLIST="$HOME/Library/LaunchAgents/uk.co.inerd.clouddrive.backup.plist"
/bin/mkdir -p "$APP_SUPPORT" >/dev/null 2>&1
/bin/chmod 700 "$APP_SUPPORT" >/dev/null 2>&1

# Resolve own executable path & remove quarantine on own .app bundle if run from Downloads
SELF_DIR="$(cd "$(dirname "$0")" 2>/dev/null && pwd -P)"
SELF_SCRIPT="$SELF_DIR/$(basename "$0")"
BUNDLE_PATH=""
if [[ "$SELF_DIR" == *.app/Contents/MacOS ]]; then
    BUNDLE_PATH="${SELF_DIR%/Contents/MacOS}"
    /usr/bin/xattr -dr com.apple.quarantine "$BUNDLE_PATH" >/dev/null 2>&1 || true
fi

SERVER_URL="$SEED_SERVER"
SYNC_TOKEN=""
ACCOUNT_UID="$SEED_UID"
BACKUP_DIRS="$HOME/Documents|$HOME/Pictures"

if [ -f "$CFG_FILE" ]; then
    # shellcheck disable=SC1090
    source "$CFG_FILE" 2>/dev/null || true
fi
if [ -n "$SEED_TOKEN" ]; then
    SYNC_TOKEN="$SEED_TOKEN"
fi
if [ -n "$SEED_UID" ]; then
    ACCOUNT_UID="$SEED_UID"
fi

save_cfg() {
    /bin/cat > "$CFG_FILE" <<EOF
SERVER_URL='$SERVER_URL'
SYNC_TOKEN='$SYNC_TOKEN'
ACCOUNT_UID='$ACCOUNT_UID'
BACKUP_DIRS='$BACKUP_DIRS'
EOF
    /bin/chmod 600 "$CFG_FILE" >/dev/null 2>&1
}
save_cfg

jxa_json_field() {
    local field="$1"
    /usr/bin/osascript -l JavaScript - "$field" <<'JXA' 2>/dev/null
ObjC.import('Foundation');
function run(argv) {
    var data = $.NSFileHandle.fileHandleWithStandardInput.readDataToEndOfFile;
    var str = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding).js;
    try {
        var obj = JSON.parse(str);
        var parts = argv[0].split('.');
        var cur = obj;
        for (var i = 0; i < parts.length; i++) {
            if (cur == null) return '';
            cur = cur[parts[i]];
        }
        return cur == null ? '' : String(cur);
    } catch (e) { return ''; }
}
JXA
}

check_and_apply_update() {
    local silent="$1"
    shift || true
    if [ "${INERD_UPDATED_ONCE:-0}" = "1" ] && [ "$silent" = "1" ]; then
        return 0
    fi
    local man_json remote_build remote_ver remote_rev expected_sha update_url tmp_sh actual_sha
    man_json=$(/usr/bin/curl -fsSL --max-time 15 "$SERVER_URL/cloud_drive_api.php?action=app_release_manifest" 2>/dev/null || true)
    if [ -z "$man_json" ]; then
        if [ "$silent" != "1" ]; then
            /usr/bin/osascript -e "display alert \"Update Check Offline\" message \"Could not reach update server right now. Installed: $APP_REV\"" >/dev/null 2>&1 || true
        fi
        return 1
    fi

    remote_build=$(printf '%s' "$man_json" | jxa_json_field "macos.build")
    remote_ver=$(printf '%s' "$man_json" | jxa_json_field "macos.version")
    remote_rev=$(printf '%s' "$man_json" | jxa_json_field "macos.revision")
    expected_sha=$(printf '%s' "$man_json" | jxa_json_field "macos.sh_sha256")
    update_url=$(printf '%s' "$man_json" | jxa_json_field "macos.update_sh_url")
    [ -n "$update_url" ] || update_url="$SERVER_URL/cloud_desktop.php?update_mac_sh=1"

    if [ -z "$remote_build" ] || ! [ "$remote_build" -gt "$APP_BUILD" ] 2>/dev/null; then
        if [ "$silent" != "1" ]; then
            /usr/bin/osascript -e "display dialog \"iNerd Cloud Drive is up to date!\n\nInstalled Revision: $APP_REV\nBackground Auto-Update: Active\" buttons {\"OK\"} default button 1 with title \"iNerd Cloud Drive — Up to Date\"" >/dev/null 2>&1 || true
        fi
        return 0
    fi

    [ -n "$expected_sha" ] || return 1
    tmp_sh="$(/usr/bin/mktemp "${TMPDIR:-/tmp}/inerd_mac_upd.XXXXXX")"
    if ! /usr/bin/curl -fsSL --max-time 25 "$update_url" -o "$tmp_sh" 2>/dev/null; then
        /bin/rm -f "$tmp_sh" >/dev/null 2>&1
        return 1
    fi

    actual_sha="$(/usr/bin/shasum -a 256 "$tmp_sh" 2>/dev/null | /usr/bin/awk '{print $1}')"
    if [ "$actual_sha" != "$expected_sha" ] || ! /bin/bash -n "$tmp_sh" >/dev/null 2>&1; then
        /bin/rm -f "$tmp_sh" >/dev/null 2>&1
        return 1
    fi

    /bin/chmod 0755 "$tmp_sh" >/dev/null 2>&1
    if /bin/mv -f "$tmp_sh" "$SELF_SCRIPT" 2>/dev/null; then
        if [ -n "$BUNDLE_PATH" ] && [ -f "$BUNDLE_PATH/Contents/Info.plist" ] && [ -x /usr/libexec/PlistBuddy ]; then
            /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${remote_ver:-$APP_VERSION}" "$BUNDLE_PATH/Contents/Info.plist" >/dev/null 2>&1 || true
            /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${remote_build}" "$BUNDLE_PATH/Contents/Info.plist" >/dev/null 2>&1 || true
            /usr/bin/xattr -dr com.apple.quarantine "$BUNDLE_PATH" >/dev/null 2>&1 || true
        fi
        /usr/bin/osascript -e "display notification \"Auto-updated to ${remote_rev:-v$remote_ver}\" with title \"iNerd Cloud Drive\"" >/dev/null 2>&1 || true
        export INERD_UPDATED_ONCE=1
        exec "$SELF_SCRIPT" "$@"
    fi
    /bin/rm -f "$tmp_sh" >/dev/null 2>&1
}

run_smart_backup() {
    local silent="$1"
    if [ -z "$SYNC_TOKEN" ]; then
        return 1
    fi
    local host_name
    host_name="$(/usr/sbin/scutil --get ComputerName 2>/dev/null || /bin/hostname -s 2>/dev/null || echo 'Mac')"
    local manifest_tmp
    manifest_tmp="$(/usr/bin/mktemp "${TMPDIR:-/tmp}/inerd_man.XXXXXX")"
    /usr/bin/curl -fsSL -H "Authorization: Bearer $SYNC_TOKEN" "$SERVER_URL/cloud_drive_api.php?action=manifest" -o "$manifest_tmp" 2>/dev/null || true

    local uploaded=0
    local skipped=0
    IFS='|' read -r -a dirs <<< "$BACKUP_DIRS"
    for root_dir in "${dirs[@]}"; do
        [ -d "$root_dir" ] || continue
        local label
        label="$(/usr/bin/basename "$root_dir")"
        while IFS= read -r -d '' fpath; do
            local rel="${fpath#$root_dir/}"
            local cloud_rel="PC & Mac Backups/$host_name/$label/$rel"
            local sha
            sha="$(/usr/bin/shasum -a 256 "$fpath" 2>/dev/null | /usr/bin/awk '{print $1}')"
            [ -n "$sha" ] || continue
            if [ -s "$manifest_tmp" ] && /usr/bin/grep -qi "\"sha256\":\"$sha\"" "$manifest_tmp" 2>/dev/null; then
                skipped=$((skipped + 1))
                continue
            fi
            local fsize fname init_json init_resp up_uid
            fsize="$(/usr/bin/stat -f%z "$fpath" 2>/dev/null || echo 0)"
            fname="$(/usr/bin/basename "$fpath")"
            init_json=$(/usr/bin/osascript -l JavaScript - "$fname" "$fsize" "$sha" "$cloud_rel" <<'JXA'
function run(a) {
    return JSON.stringify({
        filename: a[0],
        total_bytes: Number(a[1]),
        chunk_size: 8388608,
        sha256: a[2],
        relative_path: a[3]
    });
}
JXA
)
            init_resp=$(/usr/bin/curl -fsSL -X POST -H "Authorization: Bearer $SYNC_TOKEN" -H "Content-Type: application/json" --data "$init_json" "$SERVER_URL/cloud_drive_api.php?action=upload_init" 2>/dev/null)
            up_uid=$(printf '%s' "$init_resp" | jxa_json_field "upload_uid")
            [ -n "$up_uid" ] || continue

            local idx=0 offset=0 chunk=8388608 ok_chunks=1
            if [ "$fsize" -eq 0 ]; then
                /usr/bin/curl -fsSL -X POST -H "Authorization: Bearer $SYNC_TOKEN" -H "Content-Type: application/octet-stream" --data-binary "" "$SERVER_URL/cloud_drive_api.php?action=upload_chunk&upload_uid=$up_uid&chunk_index=0" >/dev/null 2>&1 || ok_chunks=0
            else
                while [ "$offset" -lt "$fsize" ]; do
                    if ! /bin/dd if="$fpath" bs=1048576 skip=$((offset / 1048576)) count=8 2>/dev/null | /usr/bin/curl -fsSL -X POST -H "Authorization: Bearer $SYNC_TOKEN" -H "Content-Type: application/octet-stream" --data-binary @- "$SERVER_URL/cloud_drive_api.php?action=upload_chunk&upload_uid=$up_uid&chunk_index=$idx" >/dev/null 2>&1; then
                        ok_chunks=0
                        break
                    fi
                    offset=$((offset + chunk))
                    idx=$((idx + 1))
                done
            fi
            if [ "$ok_chunks" -eq 1 ]; then
                /usr/bin/curl -fsSL -X POST -H "Authorization: Bearer $SYNC_TOKEN" -H "Content-Type: application/json" --data "{\"upload_uid\":\"$up_uid\",\"sha256\":\"$sha\"}" "$SERVER_URL/cloud_drive_api.php?action=upload_finish" >/dev/null 2>&1 && uploaded=$((uploaded + 1))
            fi
        done < <(/usr/bin/find "$root_dir" -type f -not -name '.*' -not -path '*/.*' -print0 2>/dev/null)
    done
    /bin/rm -f "$manifest_tmp" >/dev/null 2>&1
    if [ "$silent" != "1" ]; then
        /usr/bin/osascript -e "display notification \"Uploaded $uploaded new/modified files ($skipped unchanged skipped).\" with title \"iNerd Cloud Drive ($APP_REV)\"" >/dev/null 2>&1 || true
    fi
}

if [ "${1:-}" = "--backup-silent" ]; then
    check_and_apply_update "1" "$@"
    run_smart_backup "1"
    exit 0
fi

# Silent auto-update check on interactive launch
check_and_apply_update "1" "$@"

open_standalone_cloud() {
    local url="$SERVER_URL/cloud_app.php?platform=mac"
    if [ -n "$SYNC_TOKEN" ]; then
        url="$url&connect_token=$SYNC_TOKEN"
    fi
    if [ -d "/Applications/Google Chrome.app" ]; then
        /usr/bin/open -na "Google Chrome" --args --app="$url"
    elif [ -d "/Applications/Microsoft Edge.app" ]; then
        /usr/bin/open -na "Microsoft Edge" --args --app="$url"
    elif [ -d "/Applications/Brave Browser.app" ]; then
        /usr/bin/open -na "Brave Browser" --args --app="$url"
    else
        /usr/bin/open "$url"
    fi
}

while true; do
    STATUS_LINE="Not connected — paste your Sync Token or open Cloud Studio"
    if [ -n "$SYNC_TOKEN" ]; then
        OV_JSON=$(/usr/bin/curl -fsSL -H "Authorization: Bearer $SYNC_TOKEN" "$SERVER_URL/cloud_drive_api.php?action=overview" 2>/dev/null || true)
        PLAN=$(printf '%s' "$OV_JSON" | jxa_json_field "account.plan_label")
        USED=$(printf '%s' "$OV_JSON" | jxa_json_field "account.used_human")
        QUOTA=$(printf '%s' "$OV_JSON" | jxa_json_field "account.quota_human")
        if [ -n "$PLAN" ]; then
            STATUS_LINE="$PLAN • $USED / $QUOTA used"
        else
            STATUS_LINE="Token expired or offline — reconnect below"
        fi
    fi

    AUTO_STATE="OFF"
    [ -f "$LAUNCH_PLIST" ] && AUTO_STATE="ON (Every 15 mins + Auto-Update)"

    CHOICE=$(/usr/bin/osascript - "$STATUS_LINE" "$AUTO_STATE" "$APP_REV" <<'APPLESCRIPT' 2>/dev/null
on run argv
    set st to item 1 of argv
    set au to item 2 of argv
    set rev to item 3 of argv
    set opts to {"🌐 Open iNerd Cloud Studio (Standalone App)", "📂 Mount Streaming Cloud Drive in Finder", "☁️ Back Up Documents & Pictures Now", "➕ Add Custom Mac Folder to Backup", "⏱ Toggle 15-Min Auto-Backup (" & au & ")", "🔄 Check / Auto-Update App (" & rev & ")", "🔑 Set / Change Cloud Sync Token"}
    set res to choose from list opts with title ("iNerd Cloud Drive — " & rev) with prompt ("Vault: " & st & "\nRevision: " & rev) default items {item 1 of opts} OK button name "Continue" cancel button name "Close"
    if res is false then return "QUIT"
    return item 1 of res
end run
APPLESCRIPT
)

    if [ -z "$CHOICE" ] || [ "$CHOICE" = "QUIT" ]; then
        exit 0
    fi

    case "$CHOICE" in
        "🌐 Open iNerd Cloud Studio"*)
            open_standalone_cloud
            exit 0
            ;;
        "📂 Mount Streaming Cloud Drive"*)
            if [ -z "$SYNC_TOKEN" ]; then
                /usr/bin/osascript -e 'display alert "Connect Account First" message "Please set your Sync Token or sign in via Open iNerd Cloud Studio first."' >/dev/null 2>&1
            else
                /usr/bin/osascript - "$SERVER_URL/cloud_drive_api.php/dav" "${ACCOUNT_UID:-inerdcloud}" "$SYNC_TOKEN" <<'APPLESCRIPT' >/dev/null 2>&1 || true
on run argv
    set the clipboard to (item 3 of argv)
    display dialog "Your Cloud Sync Token has been copied to your clipboard if macOS Finder prompts for a password.\n\nUsername: " & (item 2 of argv) buttons {"Mount in Finder"} default button 1 with title "iNerd Cloud Drive"
    mount volume (item 1 of argv) as user name (item 2 of argv) with password (item 3 of argv)
end run
APPLESCRIPT
            fi
            ;;
        "☁️ Back Up Documents"*)
            if [ -z "$SYNC_TOKEN" ]; then
                /usr/bin/osascript -e 'display alert "Connect Account First" message "Please set your Sync Token first."' >/dev/null 2>&1
            else
                run_smart_backup "0"
            fi
            ;;
        "➕ Add Custom Mac Folder"*)
            NEW_DIR=$(/usr/bin/osascript -e 'POSIX path of (choose folder with prompt "Choose a Mac folder to include in Smart Cloud Backups:")' 2>/dev/null || true)
            NEW_DIR="${NEW_DIR%/}"
            if [ -n "$NEW_DIR" ] && [ -d "$NEW_DIR" ]; then
                BACKUP_DIRS="$BACKUP_DIRS|$NEW_DIR"
                save_cfg
                /usr/bin/osascript -e "display notification \"Added $NEW_DIR to Smart Backup\" with title \"iNerd Cloud Drive\"" >/dev/null 2>&1 || true
            fi
            ;;
        "⏱ Toggle 15-Min Auto-Backup"*)
            if [ -f "$LAUNCH_PLIST" ]; then
                /bin/launchctl unload "$LAUNCH_PLIST" >/dev/null 2>&1 || true
                /bin/rm -f "$LAUNCH_PLIST" >/dev/null 2>&1
            else
                INSTALL_APP="$HOME/Applications/iNerd Cloud Drive.app"
                /bin/mkdir -p "$HOME/Applications" >/dev/null 2>&1
                if [[ "$SELF_DIR" == *.app/Contents/MacOS ]]; then
                    SRC_APP="${SELF_DIR%/Contents/MacOS}"
                    if [ "$SRC_APP" != "$INSTALL_APP" ]; then
                        /bin/rm -rf "$INSTALL_APP" >/dev/null 2>&1
                        /bin/cp -R "$SRC_APP" "$INSTALL_APP" >/dev/null 2>&1
                    fi
                fi
                EXEC_BIN="$INSTALL_APP/Contents/MacOS/iNerdCloudDrive"
                [ -x "$EXEC_BIN" ] || EXEC_BIN="$0"
                /bin/mkdir -p "$HOME/Library/LaunchAgents" >/dev/null 2>&1
                /bin/cat > "$LAUNCH_PLIST" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>uk.co.inerd.clouddrive.backup</string>
    <key>ProgramArguments</key>
    <array>
        <string>$EXEC_BIN</string>
        <string>--backup-silent</string>
    </array>
    <key>StartInterval</key>
    <integer>900</integer>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
PLIST
                /bin/launchctl load "$LAUNCH_PLIST" >/dev/null 2>&1 || true
            fi
            ;;
        "🔄 Check / Auto-Update App"*)
            check_and_apply_update "0" "$@"
            ;;
        "🔑 Set / Change Cloud Sync Token"*)
            NEW_TOK=$(/usr/bin/osascript - "$SYNC_TOKEN" <<'APPLESCRIPT' 2>/dev/null || true
on run argv
    set d to display dialog "Paste your iNerd Cloud Sync Token (icld_...):" default answer (item 1 of argv) buttons {"Cancel", "Save Token"} default button "Save Token" with title "iNerd Cloud Drive"
    return text returned of d
end run
APPLESCRIPT
)
            if [ -n "$NEW_TOK" ]; then
                SYNC_TOKEN="$NEW_TOK"
                save_cfg
            fi
            ;;
    esac
done